library(tidyverse)
library(plotly)
# 1. RECONSTRUCCIÓN DE LA DATA (Extraída del código fuente Flourish)
# Se han limpiado los valores vacíos "" y guiones "-" por 0
data_curso_vida <- tribble(
~Etapa, ~Etnia, ~`2019`, ~`2020`, ~`2021`, ~`2022`, ~`2023`,
"18-29a", "Achuar", 0, 0, 2, 2, 0,
"30-59a", "Achuar", 2, 0, 1, 3, 1,
"01-05a", "Ashaninka", 0, 0, 0, 1, 0,
"06-11a", "Ashaninka", 1, 0, 2, 0, 0,
"18-29a", "Ashaninka", 1, 2, 1, 0, 0,
"30-59a", "Ashaninka", 0, 2, 0, 0, 1,
"60a >", "Ashaninka", 0, 0, 0, 0, 1,
"12-17a", "Awajún", 0, 1, 0, 1, 1,
"18-29a", "Awajún", 0, 0, 1, 1, 4,
"30-59a", "Awajún", 1, 1, 0, 1, 2,
"60a >", "Awajún", 0, 1, 0, 0, 0,
"18-29a", "Bora", 0, 0, 0, 0, 1,
"30-59a", "Bora", 0, 0, 0, 0, 1,
"18-29a", "Chapra", 0, 1, 0, 0, 0,
"30-59a", "Chapra", 0, 1, 0, 0, 0,
"18-29a", "Ese Eja", 0, 0, 0, 2, 0,
"30-59a", "Harakbut", 0, 0, 0, 1, 0,
"12-17a", "Kandozi", 0, 0, 0, 1, 0,
"30-59a", "Kandozi", 0, 1, 0, 0, 3,
"01-05a", "Kakataibo", 0, 0, 1, 0, 0,
"01-05a", "Kichwa", 1, 0, 0, 0, 0,
"12-17a", "Kichwa", 0, 0, 1, 1, 0,
"18-29a", "Kichwa", 1, 0, 0, 1, 0,
"30-59a", "Kichwa", 2, 1, 0, 2, 3,
"60a >", "Kichwa", 0, 0, 0, 0, 1,
"18-29a", "Kukama Kukamiria", 1, 0, 0, 1, 3,
"30-59a", "Matsés", 1, 0, 0, 0, 0,
"30-59a", "Matsigenka", 0, 0, 1, 0, 1,
"60a >", "Matsigenka", 0, 0, 2, 1, 0,
"18-29a", "Ocaina", 1, 0, 0, 0, 0,
"30-59a", "Sharanahua", 0, 0, 0, 1, 0,
"12-17a", "Shawi", 0, 0, 1, 1, 0,
"18-29a", "Shawi", 0, 0, 0, 0, 1,
"30-59a", "Shawi", 0, 0, 0, 4, 5,
"60a >", "Shawi", 0, 0, 0, 0, 1,
"18-29a", "Shipibo-Konibo", 0, 1, 0, 0, 0,
"30-59a", "Shiwilu", 0, 0, 0, 0, 2,
"18-29a", "Tikuna", 0, 0, 0, 0, 3,
"30-59a", "Tikuna", 0, 0, 0, 0, 1,
"01-05a", "Wampis", 0, 0, 1, 0, 0,
"18-29a", "Wampis", 0, 0, 0, 0, 1,
"30-59a", "Wampis", 1, 1, 0, 0, 2,
"60a >", "Wampis", 0, 1, 0, 0, 0,
"18-29a", "Yanesha", 0, 0, 0, 1, 0,
"30-59a", "Yanesha", 1, 0, 0, 0, 1,
"60a >", "Yanesha", 0, 0, 0, 1, 0,
"18-29a", "Yine", 1, 0, 0, 0, 0,
"30-59a", "Yine", 1, 0, 0, 0, 0,
"60a >", "Yine", 0, 0, 1, 0, 0
)
# 2. PROCESAMIENTO
# Ordenamos las etapas de vida cronológicamente, no alfabéticamente
library(tidyverse)
library(plotly)
library(stringr) # Necesario para cortar los textos largos
# 1. PROCESAMIENTO (Aseguramos el orden de factores)
etapas_orden <- c("01-05a", "06-11a", "12-17a", "18-29a", "30-59a", "60a >")
grafico_data <- data_curso_vida %>%
pivot_longer(cols = `2019`:`2023`, names_to = "Anio", values_to = "Casos") %>%
mutate(
Etapa = factor(Etapa, levels = etapas_orden),
Anio = factor(Anio, levels = c("2023", "2022", "2021", "2020", "2019")),
# TRUCO 1: Cortamos los nombres largos a 15 caracteres para que entren en 2 columnas
Etnia_Wrapped = str_wrap(Etnia, width = 15)
) %>%
filter(Casos > 0)
# 2. CREACIÓN DEL GRÁFICO
g <- ggplot(grafico_data, aes(x = Casos, y = Etnia_Wrapped, fill = Anio)) +
geom_col(position = position_stack(reverse = TRUE)) +
# CAMBIO: Usamos facet_wrap con 2 columnas
# scales = "free_y" es vital para ocultar etnias sin casos en cada grupo
facet_wrap(~Etapa, scales = "free_y", ncol = 2) +
scale_fill_viridis_d(option = "plasma", direction = -1, name = "Año") +
labs(
title = "",
x = "Número de Casos",
y = ""
) +
theme_minimal() +
theme(
strip.text = element_text(face = "bold", size = 11),
strip.background = element_rect(fill = "#e5eff5", color = NA),
panel.spacing.x = unit(1.5, "cm"), # Espacio horizontal extra entre columnas
panel.spacing.y = unit(0.5, "cm"), # Espacio vertical
axis.text.y = element_text(size = 9) # Texto un poco más pequeño para que quepa
)
# 3. INTERACTIVIDAD
# Ajustamos height a 1000px para dar espacio vertical suficiente
ggplotly(g, height = 1000, tooltip = c("y", "x", "fill")) %>%
layout(
# 1. Configuración de la leyenda ABAJO
legend = list(
orientation = "h", # Horizontal
xanchor = "center", # Anclada al centro
x = 0.5, # Centrada horizontalmente
y = -0.05 # Un poco por debajo del gráfico (negativo)
),
# 2. Ajuste de márgenes (Damos espacio abajo 'b' para la leyenda)
margin = list(l = 120, r = 20, t = 60, b = 100),
autosize = TRUE
)